import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;


public class TConsultor 
{
	TGrafoDirigido grafo;
	ArrayList<String> Listaaeropuertos;
	public ArrayList<String> getListaaeropuertos() {
		return Listaaeropuertos;
	}
	private String areopuertos;
	private String Conexiones;
	
	public TConsultor (String archivoaeropuerto, String archivoConexiones)
	{
		grafo = new TGrafoDirigido();
		Listaaeropuertos = new ArrayList<String>();
		this.Conexiones = archivoConexiones;
		this.areopuertos = archivoaeropuerto;
		cargarVertices();
		cargarAdyacencias();
	}
	
	/**
	 * Metodo encargado de leer los datos del archivo de entrada de aeropuertos e insertarlos en el grafo
	 */
	public void cargarVertices()
	{
		try
	
		{
			FileReader archivo = new FileReader(areopuertos);
			BufferedReader buffer = new BufferedReader(archivo);
			String linea = buffer.readLine();
			while (linea != null) 
			{
				String[] dato = linea.split(",");
				int numeroDeaeropuerto =  Integer.parseInt(dato[0]);
				Listaaeropuertos.add(dato[1]);
				grafo.insertarVertice(numeroDeaeropuerto);
				linea = buffer.readLine();
			}
			buffer.close();
			archivo.close();
		}
		catch (IOException ioe) 
		{
			System.out.println("Error al leer el archivo  " +  this.areopuertos);
		}		
	}
	
	/**
	 * Metodo encargado de leer los datos del archivo de entrada de conexiones e insertarlas en el grafo
	 */
	public void cargarAdyacencias()
	{
		try
		{
			FileReader archivo = new FileReader(this.Conexiones);
			BufferedReader buffer = new BufferedReader(archivo);
			String linea = buffer.readLine();
			while (linea != null) 
			{
				String[] dato = linea.split(",");
				int aeropuertoOrigen = Integer.parseInt(dato[0]);
				int aeropuertoDestino = Integer.parseInt(dato[1]);
				try
				{
					int costo = Integer.parseInt(dato[2]);
					grafo.insertarAdyacencia(aeropuertoOrigen, aeropuertoDestino, costo);
				}
				catch (IndexOutOfBoundsException e)
				{
					System.out.println("mal");
				}
				linea = buffer.readLine();
			}
			buffer.close();
			archivo.close();
		}
		catch (IOException ioe) 
		{
			System.out.println("Error al leer el archivo  " +  this.Conexiones);
		}
	}
	
	public void mostrarMatriz(){

		Integer[][] matriz = UtilGrafos.obtenerMatrizCostos(grafo.vertices);
		UtilGrafos.imprimirMatriz(matriz, grafo.vertices.etiquetasToArray());
	}
	public Comparable devolverCentro(){
		return grafo.centroDelGrafo();
	}
	public Comparable distanciaCiudades(Comparable verticeOrigen, Comparable verticeDestino){
		int verOr = Listaaeropuertos.indexOf(verticeOrigen);
		int vertDes = Listaaeropuertos.indexOf(verticeDestino);
		Integer[][] matriz = UtilGrafos.obtenerMatrizCostos(grafo.vertices);
		return matriz[verOr][vertDes];
	}

	public void bpf(Comparable unaEtiqueta){
		TRecorrido recorrido= new TRecorrido();
		recorrido=grafo.bpf(unaEtiqueta);
		recorrido.imprimirEtiquetas();
	}
	
	public void todosloscaminos(Comparable origen,Comparable destino){
		grafo.todosLosCaminos(origen, destino);
		
	}
}